package c05面向对象;

class Out {
	//定义一个内部类，不使用访问控制符，
	//即只有同一个包中其他类可访问该内部类
	class In {
		public In(String msg) {
			System.err.println(msg);
		}
	}

	class SubIn extends In {
		public SubIn(String msg) {
			super(msg);
		}
	}
}

//在外部类以外继承非静态内部类时要注意的事情
class SubClass extends Out.In {
	//显示定义SubClass的构造器，否则出错！
	public SubClass(Out out, String msg) {
		//通过传入的Out对象和msg显式调用In的构造器
		out.super(msg);
	}
}

public class 在外部类以外使用非静态内部类 {
	public static void main(String[] args) {
		//在外部类外面访问内部类的完整类名都是OuterClass.InnerClass，即Out.In：
		Out.In in;
		//创建外部类实例，非静态内部类实例将寄存在该实例中
		Out out = new Out();
		//通过外部类实例和new来调用内部类构造器创建非静态内部类实例
		in = out.new In("测试信息");//构造器不再带前缀即不能写成下面这样：
//		in = out.new Out.In("测试信息");//编译出错！

		//或者使用连续实例化简化如下：
		Out.In in2 = new Out().new In("测试信息");

		SubClass sc = new SubClass(out, "我勒个去");
	}
}
